package basics.day18.ArrayList.GenericDemo;

import java.util.*;

/* *
 * 1. 申明集合是的时候，建议携带泛型，这样强制要求集合内的元素类型，在遍历的时候容易知道元素类型，从而申明变量接受
 * 2. 泛型类，比如ArrayList<String>，new ArrayList类的时候，设置泛型String，强制要求ArrayList元素全都是String类型
 * 3. 泛型方法，比如ArrayList内的方法toArray()方法接受一个泛型，强制要求参数类型
 * 4. 泛型接口
 */
public class Test {
    public static void main(String[] args) {
        // fun_1();
        fun_2();
    }

    public static void fun_2() {
        /* *
         * 泛型的通配符 ？
         */
        ArrayList<String> arrayList = new ArrayList<String>();
        arrayList.add("张三1");
        arrayList.add("张三2");
        arrayList.add("张三3");
        arrayList.add("张三4");
        HashSet<Integer> set = new HashSet<Integer>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(4);
        iterator(arrayList);
        iterator(set);
    }

    /* *
     * 为什么是Collection：Collection 是HashSet和ArrayList的通用接口
     * ?：代表Collection接口的泛型是不确定的，使用通配符？
     * 元素使用Object类型接受：Collection里面的元素类型不确定，所以只能使用Object来接收
     */
    public static void iterator(Collection<?> collection) {
        Iterator<?> i = collection.iterator();
        while (i.hasNext()) {
            Object obj = i.next();
            System.out.println(obj);
        }
    }

    public static void fun_1() {
        // 申明带有泛型String的集合
        ArrayList<String> arrayList = new ArrayList<String>();
        // 添加泛型的集合，在添加元素的时候，强制要求arrayList添加的必须是String，其他的，javac编译都不能编译成功
        arrayList.add("张三1");
        arrayList.add("张三2");
        arrayList.add("张三3");
        /* *
         * toArray(T[] a)
         * 按适当顺序（从第一个到最后一个元素）返回包含此列表中所有元素的数组；
         * 返回数组的运行时类型是指定数组的运行时类型。
         */
        String[] str = new String[arrayList.size()];
        String[] strings = arrayList.toArray(str);
        System.out.println(Arrays.toString(strings));
    }
}
